package edu.object_oriented.API;

import java.util.Objects;

/**
 * 每个类都有一个共同父类  Object  一般默认不写
 */
public class ObjectPra {

    public static void main(String[] args) {
        //hasCode    返回一个对象的哈希码  每个对象都有自己的哈希码
        Stu stu = new Stu("jack", 20);
        Stu stu2 = new Stu("jack", 20);
        System.out.println(stu.hashCode());
        System.out.println(stu2.hashCode());
        //equals  用于比较对象    采用的是 ==  利用地址进行比较
        System.out.println(stu.equals(stu2));
//        stu.equals(null);
        //输出对象时会默认执行toString方法
        System.out.println(stu);
        //获取当前对象的运行时类   后期反射中会使用
        Class cla = stu.getClass();
        System.out.println("cla = " + cla);
        //获取运行时类的名字  全限定名
        String name = cla.getName();
        System.out.println("name = " + name);
    }


}
//extends Object  默认所有类都是object的子类
//equals 、hasCode 、 toString 、getClass
class Stu extends Object{

    private String name;
    private int age;

    //想实现利用学生的姓名以及年龄进行比较   重写equals
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Stu) || obj == null){
            return false;
        }
        Stu stu = (Stu)obj;
        return (this.name.equals(stu.name)&& this.age == stu.age);
    }

    //重写hasCode()
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    //toString()   将对象转成字符串表示形式  默认执行


    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Stu() {
    }

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }



}


